﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.IO;
using System.Xml;
using ZakaControloCenas.Forms;
using System.Threading;
using System.Net.Mail;
using System.Net;
using System.Text.RegularExpressions;
using System.Net.Mime;
using System.Net.Configuration;
using System.Collections;

namespace ZakaControloCenas
{
    public partial class Organizador : Form
    {
        #region Variaveis

        DataTable dtLivros;
        DataTable dtFilmes;
        DataTable dtSeries;       

        private bool boolApagar;
        private string destinatario = "jp.reisgoncalves@gmail.com";
        private string remetente = "jp.zeus@gmail.com";
        private string password = "pringle"; 

        #endregion

        #region Operações Livros/Filmes/Series

        private void CarregarDadosLivros()
        {
            try
            {
                Core.Code _Cd = new Core.Code();
                dtLivros = new DataTable();
                dtLivros = _Cd.ObterLivros();

                grdLivros.DataSource = dtLivros;
                ddlLivrosCompleto.SelectedIndex = 1;
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

        private void CarregarDadosFilmes()
        {
            try
            {
                Core.Code _Cd = new Core.Code();
                dtFilmes = new DataTable();
                dtFilmes = _Cd.ObterFilmes();

                grdFilmes.DataSource = dtFilmes;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private void CarregarDadosSeries()
        {
            try
            {
                Core.Code _Cd = new Core.Code();
                dtSeries = new DataTable();
                dtSeries = _Cd.ObterSeries();

                grdSeries.DataSource = dtSeries;
                ddlSeriesDiaRelease.SelectedIndex = 0;
            }

            catch (Exception ex)
            {
                throw ex;
            }
        }

        private void LimpaControles(string tipo)
        {
            try
            {
                boolApagar = false;

                TextBox txt = default(TextBox);

                //GroupBox grp = default(GroupBox);
                TabPage tbp = default(TabPage);
                
                switch (tipo)
                {
                    case "Livros":

                        //grp = grpLivros;
                        tbp = tabLivros;

                        break;

                    case "Filmes":

                        //grp = grpFilmes;
                        tbp = tabFilmes;

                        break;

                    case "Series":

                        //grp = grpSeries;
                        tbp = tabSeries;

                        break;

                }

                foreach (Control ctrl in tbp.Controls)
                {
                    if (object.ReferenceEquals(ctrl.GetType(), typeof(TextBox)))
                    {
                        txt = (TextBox)ctrl;
                        txt.Text = String.Empty;
                    }
                }

            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message.ToString());
            }

        }

        private void SeleccionarRegisto(string tipo)
        {
            try
            {
                if (boolApagar)
                {
                    return;
                }

                switch (tipo)
                {
                    case "Filmes":

                        for (int i = 0; i < grdFilmes.Columns.Count; i++)
                        {
                            //grdFilmes.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
                        }

                        txtGeneroFilme.Text = grdFilmes.CurrentRow.Cells["Genero"].Value.ToString();
                        txtNomeFilme.Text = grdFilmes.CurrentRow.Cells["Nome"].Value.ToString();
                        txtFilmeVisto.Text = grdFilmes.CurrentRow.Cells["DataVisualizacao"].Value.ToString();                      
                        txtPontosFilme.Text = grdFilmes.CurrentRow.Cells["Pontuacao"].Value.ToString();
                        break;

                    case "Series":

                        for (int i = 0; i < grdSeries.Columns.Count; i++)
                        {
                            //grdSeries.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
                        }

                        txtNomeSerie.Text = grdSeries.CurrentRow.Cells["Nome"].Value.ToString();
                        txtTemporadaSerie.Text = grdSeries.CurrentRow.Cells["Temporada"].Value.ToString();
                        txtEpisodioSerie.Text = grdSeries.CurrentRow.Cells["Episodio"].Value.ToString();
                        txtPontosSerie.Text = grdSeries.CurrentRow.Cells["Pontuacao"].Value.ToString();
                        ddlSeriesDiaRelease.Text = grdSeries.CurrentRow.Cells["DiaRelease"].Value.ToString();
                        txtUltimoEpisodio.Text = grdSeries.CurrentRow.Cells["UltimoEpisodio"].Value.ToString();
                    
                        break;

                    case "Livros":

                        for (int i = 0; i < grdLivros.Columns.Count; i++)
                        {
                            //grdLivros.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
                        }

                        txtNome.Text = grdLivros.CurrentRow.Cells["Nome"].Value.ToString();
                        txtGenero.Text = grdLivros.CurrentRow.Cells["Genero"].Value.ToString();
                        ddlLivrosCompleto.Text = grdLivros.CurrentRow.Cells["Completo"].Value.ToString();
                        break;
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
        }

        private void GravarDados(string tipo)
        {
            try
            {
                boolApagar = false;
                Core.Code _Code = new Core.Code();

                switch (tipo)
                {
                    case "Filmes":
                        _Code.InserirFilme(txtNomeFilme.Text, txtGeneroFilme.Text, txtFilmeVisto.Text, txtPontosFilme.Text);
                        CarregarDadosFilmes();
                        LimpaControles("Filmes");
                        MessageBox.Show("Dados salvos com sucesso.");
                        break;

                    case "Series":

                        _Code.InserirSerie(txtNomeSerie.Text, txtEpisodioSerie.Text, txtTemporadaSerie.Text, txtPontosSerie.Text, txtUltimoEpisodio.Text, ddlSeriesDiaRelease.Text);
                        CarregarDadosSeries();
                        LimpaControles("Series");
                        MessageBox.Show("Dados salvos com sucesso.");
                        break;

                    case "Livros":

                        _Code.InserirLivro(txtGenero.Text, txtNome.Text, txtCapitulo.Text, ddlLivrosCompleto.Text);
                        CarregarDadosLivros();
                        LimpaControles("Livros");
                        MessageBox.Show("Dados salvos com sucesso.");
                        break;

                    default:

                        MessageBox.Show("Não foram gravados dados.");
                        break;
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }

        }

        private void ActualizarRegisto(string tipo)
        {
            try
            {
                boolApagar = false;
                Core.Code _Code = new Core.Code();

                switch (tipo)
                {
                    case "Filmes":

                        int _IdFilme = Convert.ToInt32(grdFilmes.CurrentRow.Cells["IDFilme"].Value.ToString());
                        _Code.ActualizarFilme(_IdFilme, txtNomeFilme.Text, txtGeneroFilme.Text, txtFilmeVisto.Text, txtPontosFilme.Text);
                        CarregarDadosFilmes();
                        LimpaControles("Filmes");
                        MessageBox.Show("Dados actualizados com sucesso.");

                        break;

                    case "Livros":

                        int _IdLivro = Convert.ToInt32(grdLivros.CurrentRow.Cells["IDLivro"].Value.ToString());
                        _Code.ActualizarLivro(_IdLivro, txtGenero.Text, txtNome.Text, txtCapitulo.Text, ddlLivrosCompleto.Text);
                        CarregarDadosLivros();
                        LimpaControles("Livros");
                        MessageBox.Show("Dados actualizados com sucesso.");

                        break;

                    case "Series":

                        int _IdSerie = Convert.ToInt32(grdSeries.CurrentRow.Cells["IDSerie"].Value.ToString());
                        _Code.ActualizarSerie(_IdSerie, txtNomeSerie.Text, txtEpisodioSerie.Text, txtTemporadaSerie.Text, txtPontosSerie.Text, txtUltimoEpisodio.Text, ddlSeriesDiaRelease.Text);
                        CarregarDadosSeries();
                        LimpaControles("Series");
                        MessageBox.Show("Dados actualizados com sucesso.");

                        break;

                    default:

                        break;
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
        }

        private void ApagarRegisto(string tipo)
        {
            try
            {
                boolApagar = true;
                Core.Code _Code = new Core.Code();

                switch (tipo)
                {
                    case "Filmes":

                        if (grdFilmes.CurrentRow.Index >= 0)
                        {
                            int _IdFilme = Convert.ToInt32(grdFilmes.CurrentRow.Cells["IDFilme"].Value.ToString());
                            _Code.ApagarFilme(_IdFilme);
                            CarregarDadosFilmes();
                            LimpaControles("Filmes");
                            MessageBox.Show("Dados apagados com sucesso.");
                        }

                        break;

                    case "Livros":

                        if (grdLivros.CurrentRow.Index >= 0)
                        {
                            int _IdLivro = Convert.ToInt32(grdLivros.CurrentRow.Cells["IDLivro"].Value.ToString());
                            _Code.ApagarLivro(_IdLivro);
                            CarregarDadosFilmes();
                            LimpaControles("Livros");
                            MessageBox.Show("Dados apagados com sucesso.");
                        }

                        break;

                    case "Series":

                        if (grdSeries.CurrentRow.Index >= 0)
                        {
                            int _IdSerie = Convert.ToInt32(grdSeries.CurrentRow.Cells["IDSerie"].Value.ToString());
                            _Code.ApagarSerie(_IdSerie);
                            CarregarDadosSeries();
                            LimpaControles("Series");
                            MessageBox.Show("Dados apagados com sucesso...");
                        }

                        break;

                    default:

                        MessageBox.Show("Nada para apagar.");

                        break;
                }


            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
        }

        #endregion

        #region Operações Reporte

        private void btnEnviar_Click(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(txtAssunto.Text))
            {
                MessageBox.Show("Definição do assunto inválida.", "Erro ");
                return;
            }
            if (String.IsNullOrEmpty(txtMensagem.Text))
            {
                MessageBox.Show("Mensagem inválida.", "Erro ");
                return;
            }

            string resultado = EnviarEmail(remetente, txtAssunto.Text, txtMensagem.Text);

            MessageBox.Show(resultado, "Email enviado com sucesso");

            //separa os anexos em um array de string
            //string[] arr = txtAnexos.Text.Split(';');

            //cria um novo arraylist
            //aAnexosEmail = new ArrayList();

            //percorre o array de string e inclui os anexos
            //for (int i = 0; i < arr.Length; i++)
            //{
            //    if (!String.IsNullOrEmpty(arr[i].ToString().Trim()))
            //    {
            //        aAnexosEmail.Add(arr[i].ToString().Trim());
            //    }
            //}

            // Se existirem anexos , envia a mensagem com 
            // a chamada a EnviaMensagemComAnexos senão
            // usa o método enviaMensagemEmail
            //if (aAnexosEmail.Count > 0)
            //{
            //    string resultado = EnviaEmail.EnviaEmail.EnviaMensagemComAnexos(txtEnviarPara.Text,
            //        txtEnviadoPor.Text, txtAssuntoTitulo.Text, txtMensagem.Text,
            //        aAnexosEmail);
            //    MessageBox.Show(resultado, "Email enviado com sucesso");
            //}
            //else
            //{

            //}
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            txtAssunto.Text = string.Empty;
            txtMensagem.Text = string.Empty;
        }

        private string EnviarEmail(string remetente, string assunto, string mensagem)
        {
            try
            {
                // valida o email
                bool bValidaEmail = ValidarEmail(remetente);

                // Se o email não é validao retorna uma mensagem
                if (bValidaEmail == false)
                    return "Email inválido: " + remetente;

                // cria uma mensagem
                MailMessage mensagemEmail = new MailMessage(remetente, destinatario, assunto, mensagem);

                SmtpClient client = new SmtpClient("smtp.gmail.com");
                NetworkCredential cred = new NetworkCredential(remetente, password);

                client.Credentials = cred;
                client.EnableSsl = true;

                // inclui as credenciais
                //client.UseDefaultCredentials = true;

                // envia a mensagem
                client.Send(mensagemEmail);

                return "Mensagem enviada às " + DateTime.Now.ToString() + ".";
            }
            catch (Exception ex)
            {
                string erro = ex.Message.ToString();
                return ex.Message.ToString() + erro;
            }

        }

        private string EnviarEmailAnexos(string remetente, string assunto, string mensagem, ArrayList anexos)
        {
            try
            {
                // valida o email
                bool bValidaEmail = ValidarEmail(remetente);

                if (bValidaEmail == false)
                    return "Email inválido:" + remetente;

                // Cria uma mensagem
                MailMessage mensagemEmail = new MailMessage(
                   remetente, destinatario, assunto, mensagem);
                // Obtem os anexos contidos em um arquivo arraylist e inclui na mensagem
                foreach (string anexo in anexos)
                {
                    Attachment anexado = new Attachment(anexo, MediaTypeNames.Application.Octet);
                    mensagemEmail.Attachments.Add(anexado);
                }

                SmtpClient client = new SmtpClient("smtp.gmail.com", 587);
                client.EnableSsl = true;
                NetworkCredential cred = new NetworkCredential(remetente, password);
                client.Credentials = cred;

                // Inclui as credenciais
                client.UseDefaultCredentials = true;

                // envia a mensagem
                client.Send(mensagemEmail);

                return "Mensagem enviada às " + DateTime.Now.ToString() + ".";
            }
            catch (Exception ex)
            {
                string erro = ex.InnerException.ToString();
                return ex.Message.ToString() + erro;
            }

        }

        private bool ValidarEmail(string email)
        {
            try
            {
                //define a expressão regulara para validar o email
                string texto_Validar = email;
                Regex expressaoRegex = new Regex(@"\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}");

                // testa o email com a expressão
                if (expressaoRegex.IsMatch(texto_Validar))
                {
                    // o email é valido
                    return true;
                }
                else
                {
                    // o email é inválido
                    return false;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        #endregion

        #region Eventos

        #region Form

        public Organizador()
        {
            InitializeComponent();
        }

        private void Organizador_Load(object sender, EventArgs e)
        {

            LoadSplash();

            CarregarDadosLivros();
            CarregarDadosFilmes();
            CarregarDadosSeries();
        }

        private void Organizador_Resize(object sender, EventArgs e)
        {
            if (FormWindowState.Minimized == WindowState)
            {
                niOrganizador.Visible = true;
                Hide();
            }
        }

        #endregion

        #region Splash Screen

        private void LoadSplash()
        {
            this.Hide();
            Splash frmSplash = new Splash();
            frmSplash.Show();
            frmSplash.Update();
            Thread.Sleep(1000);
            frmSplash.Close();
            this.Visible = true;
        }

        #endregion

        #region Livros

        private void btnGravar_Click(object sender, EventArgs e)
        {
            GravarDados("Livros");
        }

        private void btnOrdenar_Click(object sender, EventArgs e)
        {
            //OrdenarDados();
        }

        private void btnLimpar_Click(object sender, EventArgs e)
        {
            LimpaControles("Livros");
        }

        private void btnApagar_Click(object sender, EventArgs e)
        {
            ApagarRegisto("Livros");
        }

        private void btnActualizar_Click(object sender, EventArgs e)
        {
            ActualizarRegisto("Livros");
        }

        private void grdLivros_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            SeleccionarRegisto("Livros");
        }

        #endregion

        #region Filmes

        private void btnGravarFilme_Click(object sender, EventArgs e)
        {
            GravarDados("Filmes");
        }

        private void btnActualizarFilme_Click(object sender, EventArgs e)
        {
            ActualizarRegisto("Filmes");
        }

        private void btnApagarFilme_Click(object sender, EventArgs e)
        {
            ApagarRegisto("Filmes");
        }

        private void btnLimparDadosFilme_Click(object sender, EventArgs e)
        {
            LimpaControles("Filmes");
        }

        private void grdFilmes_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            SeleccionarRegisto("Filmes");
        }

        #endregion

        #region Séries

        private void btnGravarSerie_Click(object sender, EventArgs e)
        {
            GravarDados("Series");
        }

        private void btnActualizarSerie_Click(object sender, EventArgs e)
        {
            ActualizarRegisto("Series");
        }

        private void btnApagarSerie_Click(object sender, EventArgs e)
        {
            ApagarRegisto("Series");
        }

        private void btnLimparDadosSerie_Click(object sender, EventArgs e)
        {
            LimpaControles("Series");
        }

        private void grdSeries_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            SeleccionarRegisto("Series");
        }

        #endregion

        #region Menus

        private void miRestaurar_Click(object sender, EventArgs e)
        {

            Show();
            niOrganizador.Visible = false;
            WindowState = FormWindowState.Normal;

        }

        private void miFechar_Click(object sender, EventArgs e)
        {
            Close();
        }

        #endregion           

        #endregion        
    }
}